package com.ruoyi.common.utils;

import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.DeleteObjectsResult;
import com.aliyun.oss.model.ListObjectsRequest;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import com.google.common.base.Strings;


/**
 * @description oss工具类
 */
public class OssUtils {

	public static void main(String[] args) {
		String objectKey = "zhtcc/";
		String fileName = "zhtcc/10e2c08465c4448386ca4b6cd55cb06d.jpg";
		try {
			
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
				findFile(null,null);
//			downloadFile(fileName);
			
//			delFile("zhtcc/000041668af144338d67ac0875c6ed67.jpg",null);
		} catch (Exception e) {
			e.printStackTrace();
			
			System.out.println(e.getMessage());
		}
	}
	public static void delFile(List<String> keys, InputStream inputStream) throws Exception {
		// 创建OSSClient实例。
				OSS ossClient = new OSSClient(AliyunConstants.OSS_ENDPOINT, AliyunConstants.OSS_ACCESSKEYID,
						AliyunConstants.OSS_ACCESSKEYSECRET);
		// 删除文件。
//		ossClient.deleteObject(AliyunConstants.OSS_BUCKET, fileName);
		// 删除文件。
//		keys.add("key0");
//		keys.add("key1");
//		keys.add("key2");

		DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(AliyunConstants.OSS_BUCKET).withKeys(keys));
		List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();

		// 关闭OSSClient。
		ossClient.shutdown();
					
		// 关闭OSSClient。
		ossClient.shutdown();	
	}
	
	
	/**
	 * 
	 * @param fileName
	 *            你要上传的文件名
	 * @param bytes
	 *            文件转化为byte[]
	 * @throws Exception
	 * @return oss文件路径
	 */
	public static void findFile(String fileName, InputStream inputStream) throws Exception {
		
		// Endpoint以杭州为例，其它Region请按实际情况填写。

		// 创建OSSClient实例。
		OSS ossClient = new OSSClient(AliyunConstants.OSS_ENDPOINT, AliyunConstants.OSS_ACCESSKEYID,
				AliyunConstants.OSS_ACCESSKEYSECRET);
		// 设置最大个数。
		final int maxKeys = 1000;
		// 构造ListObjectsRequest请求。
		ListObjectsRequest listObjectsRequest = new ListObjectsRequest(AliyunConstants.OSS_BUCKET).withMaxKeys(maxKeys);
		// 设置prefix参数来获取fun目录下的所有文件。
		listObjectsRequest.setPrefix("accessRecord/");

		// 递归列出fun目录下的所有文件。
		ObjectListing listing = ossClient.listObjects(listObjectsRequest);
		List<String> strings = new ArrayList<String>();
		// 遍历所有文件。
		
		for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
//		    System.out.println(objectSummary.getKey());
		    strings.add(objectSummary.getKey());
		}
		System.out.println("Objects:"+strings.size());
		if (StringUtils.isNotEmpty(strings)) {
			delFile(strings,null);
		}
		
		// 遍历所有commonPrefix。
//		System.out.println("\nCommonPrefixes:");
//		for (String commonPrefix : listing.getCommonPrefixes()) {
//		    System.out.println(commonPrefix);
//		}
		// 关闭OSSClient。
		ossClient.shutdown();
	}
	/**
	 * 
	 * @param fileName
	 *            你要上传的文件名
	 * @param bytes
	 *            文件转化为byte[]
	 * @throws Exception
	 * @return oss文件路径
	 */
	public static String uploadFile(String ossPath,String fileName, InputStream inputStream) throws Exception {
		OSSClient client = null;
//		String ossPath = "zhtcc/";
		if (Strings.isNullOrEmpty(fileName)) {
			throw new Exception("上传文件名不能为空");
		}
		String fileType = fileName.substring(fileName.lastIndexOf("."));
		String objectKey = ossPath + AliyunConstants.get32UUID() + fileType;
		try {
			client = new OSSClient(AliyunConstants.OSS_ENDPOINT, AliyunConstants.OSS_ACCESSKEYID,
					AliyunConstants.OSS_ACCESSKEYSECRET);
			client.putObject(AliyunConstants.OSS_BUCKET, objectKey, inputStream);
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		} finally {
			if (client != null) {
				client.shutdown();
			}
		}
		return objectKey;
	}
	/**
	 * 
	 * @param fileName
	 *            你要上传的文件名
	 * @param bytes
	 *            文件转化为byte[]
	 * @throws Exception
	 * @return oss文件路径
	 */
	public static String uploadFile(String ossPath,String fileName, byte[] bytes) throws Exception {
		OSSClient client = null;
//		String ossPath = "zhtcc/";
		if (Strings.isNullOrEmpty(fileName)) {
			throw new Exception("上传文件名不能为空");
		}
		String fileType = fileName.substring(fileName.lastIndexOf("."));
		String objectKey = ossPath + AliyunConstants.get32UUID() + fileType;
		try {
			client = new OSSClient(AliyunConstants.OSS_ENDPOINT, AliyunConstants.OSS_ACCESSKEYID,
					AliyunConstants.OSS_ACCESSKEYSECRET);
			client.putObject(AliyunConstants.OSS_BUCKET, objectKey, new ByteArrayInputStream(bytes));
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		} finally {
			if (client != null) {
				client.shutdown();
			}
		}
		return "http://hzyw2.oss-cn-hangzhou.aliyuncs.com/".concat(objectKey);
	}

	/**
	 * description 下载文件
	 * </p>
	 * 
	 * @param objectKey
	 *            文件key
	 * @param fileName
	 *            下载的目录
	 * @return
	 */
	private static String downloadFile(String fileName) throws Exception {

		// 创建OSSClient实例。
		OSSClient ossClient = new OSSClient(AliyunConstants.OSS_ENDPOINT, AliyunConstants.OSS_ACCESSKEYID, AliyunConstants.OSS_ACCESSKEYSECRET);

		// ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
		OSSObject ossObject = ossClient.getObject(AliyunConstants.OSS_BUCKET, fileName);

		// 读取文件内容。
		System.out.println("Object content:"+ossObject);
		BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
		String outputPath = "/Users/panglei/Desktop/"+fileName;
		BufferedWriter bWriter = new BufferedWriter(new FileWriter(outputPath));
		String line = null;
		while (!(line = reader.readLine()).equals("quit")) {
		    	bWriter.write(line);
		    	// 记得换行
	            bWriter.newLine(); 

		}
		
       bWriter.close();
		// 数据读取完成后，获取的流必须关闭，否则会造成连接泄漏，导致请求无连接可用，程序无法正常工作。
		reader.close();

		// 关闭OSSClient。
		ossClient.shutdown();
		return fileName;
	}

	/**
	 * time 22:27
	 * description 删除文件
	 * @param objectKey
	 *            文件key
	 * @throws Exception
	 */
	private static void deleteFile(String objectKey) throws Exception {
		OSSClient client = null;
		try {
			client = new OSSClient(AliyunConstants.OSS_ENDPOINT, AliyunConstants.OSS_ACCESSKEYID,
					AliyunConstants.OSS_ACCESSKEYSECRET);
			client.deleteObject(AliyunConstants.OSS_BUCKET, objectKey);

		} catch (Exception e) {
			throw new Exception(e.getMessage());
		} finally {
			if (client != null) {
				client.shutdown();
			}
		}
	}

}